package ch06.verlet
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.geom.Rectangle;

	public class VerletStickTest extends Sprite
	{
		private var _pointA:VerletPoint;
		private var _pointB:VerletPoint;
		private var _stick:VerletStick;
		private var _stageRect:Rectangle;

		public function VerletStickTest()
		{
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			_stageRect = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);

			_pointA = new VerletPoint(100, 100);
			_pointB = new VerletPoint(105, 200);

			_stick = new VerletStick(_pointA, _pointB);

			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		/**
		 * 当运行这段测试代码后，应该会看到一条线段垂直落于场景底部。但是，竟然发生了反
		   弹！我们没有加反弹代码啊，这是怎么回事？原来，这是因为线段的update 函数在试着推进
		   两个点时，接触到矩形底部的点又被强制拉了回来。同时作用的两个反作用力，导致两个点
		   稍稍向上弹起以适应所有的约束条件。
		   实际上，这个弹性更像是一种副作用。我还蛮喜欢的，不过是副作用总会有点捉摸不定
		   的问题。比如要去掉弹性时，我们就需要多调用几次点的
		   constrain 函数和线段的 update 函数，让它们尽快适应条件。
		 * @param	event
		 */
		private function onEnterFrame(event:Event):void
		{
			_pointA.y += .5;
			_pointA.update();

			_pointB.y += .5;
			_pointB.update();

			for (var i:int = 0; i < 1; i++)
			{
				_pointA.constrain(_stageRect);
				_pointB.constrain(_stageRect);
				_stick.update();
			}

			graphics.clear();
			_pointA.render(graphics);
			_pointB.render(graphics);
			_stick.render(graphics);
		}
	}
}
